JAVA Spring Cloud框架中实现多数据源配置

您所在的位置:网站首页 springcloud zuul配置 JAVA Spring Cloud框架中实现多数据源配置

JAVA Spring Cloud框架中实现多数据源配置

#JAVA Spring Cloud框架中实现多数据源配置| 来源: 网络整理| 查看: 265

业务描述: 在微服务搭建中经常会使用到多数据库情形这个时候,多数据源的切换将显得尤为重要下面是以Mysql数据库为数据源来实现的多数据源的切换方案之一。 实现过程: 1、 编写SpringCloud服务项目的配置文件,通常是修改项目中resources包下的bootstrap.yml文件(PS:也有可能是application.yml文件)这里使用yml文件格式来编写配置。

spring: #MySql数据源 datasource: #test1数据库配置 test1: #数据库连接地址 jdbc-url: jdbc:mysql://${数据库连接地址IP}:${数据库连接端口号}/${数据库名称}?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false #数据库用户名 username: ${用户名} #数据库密码 password: ${密码} #数据库连接类型这里使用了阿里巴巴的Druid连接方案,引入后会自动配置driver-class-name所需要的类型 type: com.alibaba.druid.pool.DruidDataSource #默认初始化连接数 initialSize: 5 #最小连接数 minIdle: 5 #最大连接书 maxActive: 50 #连接等待时间 maxWait: 60000 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 #测试连接 testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 50 filters: stat asyncInit: true #test2数据库配置 #属性内容同上 test2: jdbc-url: jdbc:mysql://${数据库连接地址IP}:${数据库连接端口号}/${数据库名称}?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false username: ${用户名} password: ${密码} type: com.alibaba.druid.pool.DruidDataSource initialSize: 5 minIdle: 5 maxActive: 50 maxWait: 60000 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 50 filters: stat asyncInit: true

2、 在项目中创建config->mybatis包在其中进行实现多数据源的编写(PS:也可以放在别的包下这个包是自定义的) 3、 新建DataSourceConfig类用来注入Mysql数据的配置创建连接池并注入事务管理 代码如下:

import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.core.MybatisConfiguration; import com.baomidou.mybatisplus.core.config.GlobalConfig; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; import org.apache.ibatis.logging.stdout.StdOutImpl; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.type.JdbcType; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource; import java.util.HashMap; import java.util.Map; @Configuration @MapperScan(basePackages = "com.yasun.**.mapper", sqlSessionFactoryRef = "SqlSessionFactory") public class DataSourceConfig { @Primary @Bean(name = "${数据库1}DataSource") @ConfigurationProperties(prefix = "spring.datasource.group") public DataSource getGroupDateSource() { return DataSourceBuilder.create().build(); } @Bean(name = "${数据库2}DataSource") @ConfigurationProperties(prefix = "spring.datasource.mobile") public DataSource getMobileDateSource() { return DataSourceBuilder.create().build(); } /** * 装载多个数据库源 * @param groupDataSource yasun_group_db数据库 * @param mobileDataSource yasun_mobile_db数据库 * @return 返回数据源集合 */ @Bean(name = "dynamicDataSource") public DynamicDataSource dataSource(@Qualifier("${数据库1}DataSource") DataSource ${数据库1}DataSource, @Qualifier("${数据库2}DataSource") DataSource ${数据库2}DataSource) { Map targetDataSource = new HashMap(16); targetDataSource.put(DataSourceType.DataBaseType.test1, ${数据库1}DataSource); targetDataSource.put(DataSourceType.DataBaseType.test2, ${数据库2}DataSource); DynamicDataSource dataSource = new DynamicDataSource(); dataSource.setTargetDataSources(targetDataSource); dataSource.setDefaultTargetDataSource(groupDataSource); return dataSource; } /** * 装配数据源添加扫描mapper.xml文件的路径位置 * @param dynamicDataSource 多数据库源对象 * @return 返回sql会话工厂 */ @Bean(name = "SqlSessionFactory") public SqlSessionFactory setSqlSessionFactory(@Qualifier("dynamicDataSource") DataSource dynamicDataSource) throws Exception { // 导入mybatis sql session配置 MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean(); // 指明数据源 sessionFactory.setDataSource(dynamicDataSource); // 指明mapper.xml位置(配置文件中指明的xml位置会失效用此方式代替,具体原因未知) sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/**/*Mapper.xml")); // 指明实体扫描(多个package用逗号或者分号分隔) sessionFactory.setTypeAliasesPackage("com.yasun.${项目的包名}.*.entity"); // 导入mybatis配置 MybatisConfiguration configuration = new MybatisConfiguration(); configuration.setJdbcTypeForNull(JdbcType.NULL); configuration.setMapUnderscoreToCamelCase(true); configuration.setCacheEnabled(false); // 配置打印sql语句 configuration.setLogImpl(StdOutImpl.class); sessionFactory.setConfiguration(configuration); // 添加分页功能 sessionFactory.setPlugins(mybatisPlusInterceptor()); // 导入全局配置 sessionFactory.setGlobalConfig(globalConfig()); return sessionFactory.getObject(); } /** * Mybatis-plus插件添加 * @return 返回插件集合 */ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); //分页插件 PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); paginationInnerInterceptor.setDbType(DbType.MYSQL); paginationInnerInterceptor.setOverflow(true); //防止全表更新全表删除插件 BlockAttackInnerInterceptor blockAttackInnerInterceptor = new BlockAttackInnerInterceptor(); interceptor.addInnerInterceptor(paginationInnerInterceptor); interceptor.addInnerInterceptor(blockAttackInnerInterceptor); return interceptor; } @Bean public GlobalConfig globalConfig() { GlobalConfig globalConfig = new GlobalConfig(); globalConfig.setMetaObjectHandler(new MetaHandler()); return globalConfig; } /** * 注入事务管理 */ @Bean public DataSourceTransactionManager transactionManager(DynamicDataSource dynamicDataSource) { return new DataSourceTransactionManager(dynamicDataSource); } }

4、 新建DataSourceType类,用来标记获取不同数据库的类型通俗点说就是给你的几个不同的数据库打上标记好来找到它们。 代码如下:

package com.yasun.config.mybatis; public class DataSourceType { /** *数据库类型 */ public enum DataBaseType { /** * 连接 ${数据库1}数据库 */ ${数据库1}, /** * 连接 ${数据库2}数据库 */ ${数据库2}, /** * 连接 ${数据库3}数据库 */ ${数据库3} } /** * 使用ThreadLocal保证线程安全 */ private static final ThreadLocal TYPE = new ThreadLocal(); /** * 往当前线程里设置数据源类型 * @param dataBaseType 数据源类型 */ public static void setDataBaseType(DataBaseType dataBaseType) { if (dataBaseType == null) { throw new NullPointerException(); } TYPE.set(dataBaseType); } /** * 获取数据源类型 * @return 返回数据源的类型 */ public static DataBaseType getDataBaseType() { //默认使用数据库1 return TYPE.get() == null ? DataBaseType.${数据库1}: TYPE.get(); } /** * 清空数据类型 */ public static void clearDataBaseType() { TYPE.remove(); } }

5、 创建DynamicDataSource类存储多个数据库源并记录他们(PS:这个说法并不准确个人理解) 代码如下:

package com.yasun.config.mybatis; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DataSourceType.getDataBaseType(); } }

6、 创建扫描切面使用Spring框架中的AOP功能实现在特定的包下使用特定的数据源创建DataSourceAop类。 代码如下:

package com.yasun.config.mybatis; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Aspect @Component public class DataSourceAop { /** * 设定切面地址在所有调用以下包下的任意类的任意方法或接口时切换数据源成指定数据源 */ @Before("execution(public * ${自定义包名1}.*.mapper.${自定义包名1}..*(..))") public void setDataSource${数据库1}() { DataSourceType.setDataBaseType(DataSourceType.DataBaseType.${数据库1}); } @Before("execution(public * ${自定义包名2}.*.mapper.${自定义包名2}..*(..))") public void setDataSource${数据库2}()) { DataSourceType.setDataBaseType(DataSourceType.DataBaseType.${数据库2}); } }

以上所有配置均在SpringCloud的框架中实现。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3